package DesignPattern.Facade;

/**
 * @Author self
 * @Date 2024/8/12 19:56
 */
/*
Facade（外观）模式是一种结构型设计模式，提供了一个统一的接口，用来访问子系统中的一群接口。
        它定义了一个高层接口，使得子系统更加容易使用。
        这个模式的主要目的就是为复杂的子系统提供一个简单的接口，使客户端代码与子系统之间的交互变得简单。
*/
/*优点：
        简化接口：外观模式提供了一个简单的接口，简化了客户端对复杂子系统的操作。
        松散耦合：客户端代码不需要直接与子系统交互，从而降低了耦合度。
        易于维护：子系统的变化不会影响到客户端代码，因为客户端只与外观类交互。
适用场景：
        当你需要为一个复杂的子系统提供一个简单的接口时，可以使用外观模式。
        当你希望对子系统的实现细节进行封装，并减少客户端与子系统的耦合时，可以考虑使用外观模式。*/
public class FacadePatternDemo {
    public static void main(String[] args) {
        // 创建子系统对象
        Amplifier amp = new Amplifier();
        DvdPlayer dvd = new DvdPlayer();
        Projector projector = new Projector();
        TheaterLights lights = new TheaterLights();

        // 创建外观对象，传入子系统对象
        HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, dvd, projector, lights);

        // 使用外观接口来操作复杂的子系统
        homeTheater.watchMovie("Inception");
        System.out.println();
        homeTheater.endMovie();
    }
}

